package com.example.mybatisplus0621.generator;


import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;


/**
 * 代码生成器执行逻辑：
 * 1>配置数据源-直接数据库加载表，通过解析表自动创建 domain, mapper, service ,controller 这些类
 * 2>配置全局参数-核心：创建文件的文件摆放的位置（路径）
 * 3>配置包参数-明确指定包路径，模块名，各种类包名称
 * 4>配置模板参数-明确指出模板所在位置，模板路径
 * 5>配置策略参数-用过配置可以定制哪些表需要进行代码生成，哪些不需要，表一些通用前缀配置，列前缀配置等。
 * 6>配置注入参数-配置与模板较互的自定义参数，作为拓展
 */
@Component
public class CodeGenerator {
    @Autowired
    private DataSource dataSource;   //数据源


    public void excute(){

        //新版代码生成器对象实例
        FastAutoGenerator.create(new DataSourceConfig.Builder(dataSource))
                //全局配置
                .globalConfig(builder -> builder
                        //如果之前已经执行过代码生成，后续再执行是覆盖之前代码
                        //.fileOverride()
                        //执行代码生成之后，代码文件输出到哪个位置
                        .outputDir(System.getProperty("user.dir") + "/src/main/java")
                        //代码上面注释：作者
                        .author("洋洋")
                        //是否启动swagger2配置模式， 该方法表示启动
                        //.enableSwagger()
                )
                //包配置
                .packageConfig(builder -> builder
                        //指定包路径(倒写域名)
                        .parent("com.example")
                        //模板名(项目名)
                        .moduleName("mybatisplus0621")
                        //实体类所在包名
                        .entity("entity")
                        //服务层接口所在包名
                        .service("service")
                        //服务层接口实现类所在包名
                        .serviceImpl("service.impl")
                        //mapper接口所在包名
                        .mapper("mapper")
                        //mapper.xml文件所在包名
                        .xml("mapper")
                        //表现层类锁在包名
                        .controller("controller")
                )
                //模板配置
                /*.templateConfig(builder -> builder
                        //指定实体模板路径
                        //.entity("不是自定义模板，不建议修改，使用即可")
                        //.service("不是自定义模板，不建议修改，使用即可")
                        //.mapper("不是自定义模板，不建议修改，使用即可")
                        //.mapperXml("不是自定义模板，不建议修改，使用即可")
                        //.controller("不是自定义模板，不建议修改，使用即可")
                )*/
                //策略配置
                .strategyConfig(builder -> builder
                        //需要进行代码生成的表(不写，默认是数据库所有表)
                        .addInclude("job")
                        //排除哪些不进行代码生成的表
                        //.addExclude()
                        //统一指定表的前缀
                        //.addTablePrefix("t_")
                )
                //注入配置
               /* .injectionConfig(builder -> builder

                )*/
               .templateEngine(new FreemarkerTemplateEngine())
               .execute();
    }
}
